package br.com.beans;

import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import br.com.dao.ItemSaudeDAO;

/** Classe que representa um item de saude.
 *  Um item de saude pode ser um material/medicamento,
 *  um tratamento/exame ou uma consulta medica 
 */
@Entity
@Table(name="tb_itemsaude")
public class ItemSaude {

	/** Um item de saude pode ser um material/medicamento,
     *  ou um tratamento/exame ou uma consulta medica
     */
	public static enum Tipo {
		MATERIAL, TRATAMENTO, CONSULTA
	}
	
	/** Codigo do item */
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(nullable=false)
	private int codigo;
	
	/** Descricao do item */
	@Column(length=50,nullable=false)
	private String descricao;
	
	/** Tipo de item */
	@Column(nullable=false)
	private Tipo tipo = Tipo.MATERIAL;
	
	
	/** Construtor padrao */
	public ItemSaude() {}

	/** Construtor de copia */
	public ItemSaude(ItemSaude itemSaude) {
		copiar(itemSaude);
	}

	/** Limpa todos atributos. */
	public void limpar() {
		setCodigo(0);
		setDescricao(null);
		setTipo(Tipo.MATERIAL);
	}
	
	/** Copia atributos de outro objeto.
	 *  @param obj Objeto a ser copiado */
	public void copiar(ItemSaude obj) {
		if (obj != null) {
			//codigo    = obj.codigo;
			descricao = obj.descricao;
			tipo      = obj.tipo;
		} else {
			limpar();
		}
	}
	
	/** Cadastra um material. */
	public void cadastrarMaterial() {
		ItemSaudeDAO itemSaudeDAO = new ItemSaudeDAO();
		FacesMessage facesMessage = null;
		
		setTipo(Tipo.MATERIAL);
		if (itemSaudeDAO.inserir(this)) {
			facesMessage = new FacesMessage("Material/Medicamento adicionado com sucesso.",null);  
			limpar();
		} else {
			facesMessage = new FacesMessage("Erro ao adicionar material/medicamento.",null);  
		}
		FacesContext.getCurrentInstance().addMessage(null,facesMessage);  
	}
	
	/** Cadastra um tratamento. */
	public void cadastrarTratamento() {
		ItemSaudeDAO itemSaudeDAO = new ItemSaudeDAO();
		FacesMessage facesMessage = null;
		
		setTipo(Tipo.TRATAMENTO);
		if (itemSaudeDAO.inserir(this)) {
			limpar();
			facesMessage = new FacesMessage("Tratamento/Exame adicionado com sucesso.",null);  
		} else {
			facesMessage = new FacesMessage("Erro ao adicionar tratamento/exame.",null);  
		}
		FacesContext.getCurrentInstance().addMessage(null,facesMessage);  
	}

	/** Remove um item. */
	public void remover() {
		ItemSaudeDAO itemSaudeDAO = new ItemSaudeDAO();
		FacesMessage facesMessage = null;

		if (itemSaudeDAO.excluir(getCodigo())) {
			facesMessage = new FacesMessage("Item removido com sucesso.",null);  
		} else {
			facesMessage = new FacesMessage("Erro ao remover item.",null);  
		}
		limpar();
		FacesContext.getCurrentInstance().addMessage(null,facesMessage);  
	}
	
	/** Retorna lista de materiais.
	 *  @return Lista de materiais. */
	public List<ItemSaude> getListaMaterial() {
		ItemSaudeDAO itemSaudeDAO = new ItemSaudeDAO();
		return itemSaudeDAO.listar(Tipo.MATERIAL);
	}
	
	/** Retorna lista de tratamentos.
	 *  @return Lista de tratamentos. */
	public List<ItemSaude> getListaTratamento() {
		ItemSaudeDAO itemSaudeDAO = new ItemSaudeDAO();
		return itemSaudeDAO.listar(Tipo.TRATAMENTO);
	}

	/** Retorna lista de descricoes de itens.
	 *  @return Lista de descricoes de itens. */
	public Set<String> getListaDescricao() {
		ItemSaudeDAO itemSaudeDAO = new ItemSaudeDAO();
		Set<String> resultado = new TreeSet<String>();

		List<ItemSaude> itemSaudeList = itemSaudeDAO.listar();
		if (itemSaudeList != null) {
			for (ItemSaude itemSaude : itemSaudeList){
				resultado.add(itemSaude.getDescricao());
			}
		}
		return resultado;
	}

	/** Retorna lista de descricoes de materiais.
	 *  @return Lista de descricoes de itens. */
	public Set<String> getListaMaterialDescricao() {
		ItemSaudeDAO itemSaudeDAO = new ItemSaudeDAO();
		Set<String> resultado = new TreeSet<String>();

		List<ItemSaude> itemSaudeList = itemSaudeDAO.listar(Tipo.MATERIAL);
		if (itemSaudeList != null) {
			for (ItemSaude itemSaude : itemSaudeList){
				resultado.add(itemSaude.getDescricao());
			}
		}
		return resultado;
	}

	/** Retorna lista de descricoes de tratamentos.
	 *  @return Lista de descricoes de itens. */
	public Set<String> getListaTratamentoDescricao() {
		ItemSaudeDAO itemSaudeDAO = new ItemSaudeDAO();
		Set<String> resultado = new TreeSet<String>();

		List<ItemSaude> itemSaudeList = itemSaudeDAO.listar(Tipo.TRATAMENTO);
		if (itemSaudeList != null) {
			for (ItemSaude itemSaude : itemSaudeList){
				resultado.add(itemSaude.getDescricao());
			}
		}
		return resultado;
	}

	/** Retorna true se o item e' um material */
	public boolean isMaterial() {
		return (tipo == Tipo.MATERIAL);
	}

	/** Retorna true se o item e' um tratamento */
	public boolean isTratamento() {
		return (tipo == Tipo.TRATAMENTO);
	}

	/** Retorna true se o item e' uma consulta */
	public boolean isConsulta() {
		return (tipo == Tipo.CONSULTA);
	}

	/** Retorna o tipo como um valor inteiro */
	public int getTipoAsInt() {
		return tipo.ordinal();
	}

	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Tipo getTipo() {
		return tipo;
	}

	public void setTipo(Tipo tipo) {
		this.tipo = tipo;
	}

}
